//
// Created by xujie on 2016/5/10.
//
#ifndef PRIVATE_CROWBAR_H_INCLUDED
#define PRIVATE_CROWBAR_H_INCLUDED


#include <stdio.h>
#include "MEM.h"
#include "CRB.h"
#include "CRB_dev.h"

//语句结构体（不完全类型）
typedef struct StatementList_tag Statement;

//语句链表
typedef struct StatementList_tag {
    Statement *statement;
    struct StatementList_tag *next;
} StatementList;

//正在执行的语句
typedef struct {
    StatementList *statement_list;
} Block;

//函数的参数链表
typedef struct ParamterList_tag {
    char *name; //参数名
    struct FunctionDefinition_tag *next;//参数链表所用的指针
} ParamterList;

//全局变量的结构体
typedef struct Variable_tag {
    char *name;
    CRB_Value value;
    struct Variable_tag *net;
} Variable;

//函数状态定义的结构体
typedef enum {
    CROWBAR_FUNCTION_DEFINITION = 1, //自定义函数
    NATIVE_FUNCTION_DEFINITION, //内置函数
} FunctionDefinitionType;

//函数链表
typedef struct FunctionDefinition_tag {
    char *name;
    FunctionDefinitionType type;
    union {
        struct {
            //用户自定义的函数
            ParamterList *parameter; //函数中的参数
            Block *block; //函数执行语句
        } crowbar_f;
        struct {
            //内置函数
            CRB_NativeFunctionProc *proc;
        } native_f;
    } u;
    struct FunctionDefinition_tag *next;
} FunctionDefinition;


//语法解释器的结构体
struct CRB_Interpreter_tag {
    MEM_Storage interpreter_storage; //内存生灭控制
    MEM_Storage execute_storage;     //运行时使用的内存
    Variable *variable;  //全局变量链表
    FunctionDefinition *function_list; //函数定义链表
    StatementList *statement_list; //程序语句的链表
    int current_line_number;    //编译时当前行号
};
#endif /* PRIVATE_CROWBAR_H_INCLUDED */